今天準備逆向並找出陣列的特徵。包括陣列基本特徵、使用 for loop 遍歷陣列元素、二維陣列。
可以看到數字 10h, 20h, 30h 被 mov 到 Stack 中,後面再被 call sub_1070(printf())。
解答公布:
#include <stdio.h>
int main() {
int Array[] = {16, 32, 48};
printf("Array[0]=%d\n", Array[0]);
printf("Array[0]=%d\n", Array[1]);
printf("Array[0]=%d\n", Array[2]);
return 0;
}
在 loc_11CC 中的 [rbp-24h] 為變數 i,因為初始沒賦值,所以前面的 mov dword 沒有看到它的身影。可以看到熟悉的環狀圖型,而在 loc_11A9 最下面有 add dword ptr [rbp-24h], 1 可以看出它是一個 for 迴圈,讓 [rbp-24h] 每次加一,若小於4則繼續迴圈,反之跳出。
解答公布:
#include<stdio.h>
int main(void){
int Array[] = {0, 1, 2, 3, 4};
for(int i; i <= 4; i++){
printf("The number of Array[%d] is %d\n", i, Array[i]);
}
return 0;
}
在 loc_1203 中的 [rbp - 28h],是變數 i 儲存的記憶體位置;而 loc_11F9 中的 [rbp - 24h],是變數 j 儲存的記憶體位置。可以看到 i 與 j 的初始值皆是0,而 i 的上限是 1,j 的上限是2。此外在 loc_11C0 的 add dword ptr [rbp-24h], 1 與 loc_11F9 的 jle 為 false 情況下的 add dword ptr [rbp-28h], 1 皆可說明 i 與 j 接使用 for 迴圈。
解答公布:
#include<stdio.h>
int main(){
int Array[2][3] = {{16, 32, 48}, {64, 80, 96}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("Array[%d][%d] is %d\n", i, j, Array[i][j]);
}
}
return 0;
}
今天講解陣列在逆向的時候的特徵,明天來講解指標在逆向的時候到底長什麼樣子?